﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Objects;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Ferreteria.Forms;
using Ferreteria.Clases;
using Ferreteria.Forms.Informes;



using System.Data.SqlClient;
using System.Data.Common;
using System.Data;



namespace Ferreteria
{
    public partial class Principal : Form
    {
        DisancoEntities context;
        public bool logout;
        string categUsuario;
        frmGestionPedidos frmgp;
     

        public Principal(string categoria)
        {
            InitializeComponent();

            logout = false;

            this.categUsuario = categoria;
            establecerPermisos(categoria);

            btnCerrarPestaña.ImageList = new ImageList();
            btnCerrarPestaña.ImageList.ImageSize = new System.Drawing.Size(22, 22);
            btnCerrarPestaña.ImageList.Images.Add(SystemIcons.Error);
            btnCerrarPestaña.ImageIndex = 0;

            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);



            dgvAutorizaciones.AutoGenerateColumns = false;
            dgvArticulosBajosStock.AutoGenerateColumns = false;

            buscarArticulosEscasos();

       
            validarAutorizaciones();
            buscarAutorizaciones();

            timerBuscarArticulos.Start();
            
            eliminarpedidosantiguos();
        }

       
    

    

        private void eliminarpedidosantiguos()
        {
            int count = 0;
            foreach (var ped in context.Pedido)
            {
                if (ped.ped_fecha.Date < DateTime.Now.Date)
                {
                    count = count + 1;
                    //Pedido pedaeliminar = context.Pedido.FirstOrDefault(p => p.ped_id == ped.ped_id);
                    //context.Pedido.DeleteObject(pedaeliminar);
                    
                }

             }
            if (count > 0)
                MessageBox.Show("Existen " + count + " Presupuestos de dias Anteriores", "Disanco Sanitarios", MessageBoxButtons.OK,MessageBoxIcon.Information);
                        
        }

        void cerrarPestaña(object sender, FormClosedEventArgs e)
        {
            Form control = (Form)sender;

            this.tabControlPrincipal.TabPages.Remove(this.tabControlPrincipal.TabPages[control.Text]);
        }

        void validarAutorizaciones()
        {
            try
            {
                foreach (var auth in context.Autorizaciones)
                {
                    if (auth.autorizacion_limite_fecha.Date < DateTime.Now.Date)
                        auth.autorizacion_estado = false;
                    if (auth.autorizacion_ultimo_numero == auth.autorizacion_limite_max)
                        auth.autorizacion_estado = false;
                }

                context.SaveChanges();

                var prueba = context.Autorizaciones.Where(c => c.autorizacion_estado == true && c.autorizacion_tipo_comp == "A");

                if (prueba.Count() == 0)
                    MessageBox.Show("No existe ninguna autorizacion activa para facturas A", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                prueba = context.Autorizaciones.Where(c => c.autorizacion_estado == true && c.autorizacion_tipo_comp == "B");

                if (prueba.Count() == 0)
                    MessageBox.Show("No existe ninguna autorizacion activa para facturas B", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                prueba = context.Autorizaciones.Where(c => c.autorizacion_estado == true && c.autorizacion_tipo_comp == "R");

                if (prueba.Count() == 0)
                    MessageBox.Show("No existe ninguna autorizacion activa para Remitos", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);

            }
            catch
            {
                MessageBox.Show("Error al validar las autorizaciones");
            }
        }

        void buscarAutorizaciones()
        {
            int dias = Clases.Constantes.minimo_aut_dias_restantes;
            TimeSpan tsMaximoDias = new TimeSpan(dias, 0, 0, 0);
            DateTime fechaActual = DateTime.Now.Date;

            int minimo_numeros_restantes = Clases.Constantes.minimo_aut_numeros_restantes;

            dgvAutorizaciones.Rows.Clear();

            foreach (var aut in context.Autorizaciones)
            {
                if (aut.autorizacion_estado)
                {
                    TimeSpan tsDiasRestantes = aut.autorizacion_limite_fecha.Date - fechaActual;
                    long numeros_restantes = aut.autorizacion_limite_max - aut.autorizacion_ultimo_numero;

                    if (tsDiasRestantes <= tsMaximoDias || numeros_restantes <= minimo_numeros_restantes)
                    {
                        int i = dgvAutorizaciones.Rows.Add();

                        dgvAutorizaciones.Rows[i].Cells["aut_tipo_comprobante"].Value = aut.autorizacion_tipo_comp;
                        dgvAutorizaciones.Rows[i].Cells["aut_vencimiento"].Value = aut.autorizacion_limite_fecha;
                        dgvAutorizaciones.Rows[i].Cells["aut_dias_restantes"].Value = tsDiasRestantes.Days;
                        dgvAutorizaciones.Rows[i].Cells["aut_numeros_restantes"].Value = numeros_restantes;
                    }
                }
            }
        }

        void buscarArticulosEscasos()
        {
            dgvArticulosBajosStock.Rows.Clear();

            var queryArticulos = from articulo in context.Articulos
                                 where articulo.art_stock < articulo.art_stock_minimo
                                 select articulo;

            dgvArticulosBajosStock.DataSource = queryArticulos;
            dgvArticulosBajosStock.Columns["art_nombre"].DataPropertyName = "art_nombre";
            dgvArticulosBajosStock.Columns["art_stock_minimo"].DataPropertyName = "art_stock_minimo";
            dgvArticulosBajosStock.Columns["art_stock"].DataPropertyName = "art_stock";
        }

        void establecerPermisos(string categoria)
        {
            switch (categoria)
            {
                case "A":
                    break;

                case "B":
                    administracionToolStripMenuItem.Enabled = false;
                    administracionToolStripMenuItem.Visible = false;

                    configuracionesToolStripMenuItem.Enabled = false;
                    configuracionesToolStripMenuItem.Visible = false;
                    
                    comprasToolStripMenuItem.DropDownItems[0].Enabled = true;
                    comprasToolStripMenuItem.DropDownItems[0].Visible = true;

                    comprasToolStripMenuItem.DropDownItems[1].Enabled = true;
                    comprasToolStripMenuItem.DropDownItems[1].Visible = true;
                     
                    informesToolStripMenuItem.Enabled = true;
                    informesToolStripMenuItem.Visible = true;


                    //gestionToolStripMenuItem1.Enabled = false;
                    //gestionToolStripMenuItem1.Visible = false;
                    break;

                default:
                //    gestionToolStripMenuItem1.Enabled = false;
                //    gestionToolStripMenuItem1.Visible = false;

                    informesToolStripMenuItem.Enabled = false;
                    informesToolStripMenuItem.Visible = false;

                    
                    configuracionesToolStripMenuItem.DropDownItems[0].Enabled = true;
                    configuracionesToolStripMenuItem.DropDownItems[2].Enabled = false;
                    configuracionesToolStripMenuItem.DropDownItems[3].Enabled = false;
                    configuracionesToolStripMenuItem.DropDownItems[1].Enabled = false;
                    configuracionesToolStripMenuItem.DropDownItems[2].Visible = false;
                    configuracionesToolStripMenuItem.DropDownItems[3].Visible = false;
                    configuracionesToolStripMenuItem.DropDownItems[1].Visible = false;
                    administracionToolStripMenuItem.Enabled = false;
                    administracionToolStripMenuItem.Visible = false;

                    comprasToolStripMenuItem.DropDownItems[0].Enabled = false;
                    comprasToolStripMenuItem.DropDownItems[0].Visible = false;
                    informesToolStripMenuItem.Enabled = true;
                    informesToolStripMenuItem.Visible = true;

                    linkLblResumendeCuenta.Enabled = false;
                    linkLblResumendeCuenta.Visible = false;
                    break;
            }
        }

        private void timerBuscarArticulos_Tick(object sender, EventArgs e)
        {
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            buscarArticulosEscasos();
        }

        public void generarPestaña(Form ventana)
        {
            string key = ventana.Text;
            bool encontrado = false;

            foreach (TabPage pest in tabControlPrincipal.TabPages)
            {
                if (pest.Name == key)
                {
                    encontrado = true;
                    tabControlPrincipal.SelectedTab = pest;
                    break;
                }
            }

            if (!encontrado)
            {
                ventana.TopLevel = false;
                ventana.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
                ventana.Dock = DockStyle.Fill;

                tabControlPrincipal.TabPages.Add(key, ventana.Text);
                tabControlPrincipal.TabPages[key].Controls.Add(ventana);
                tabControlPrincipal.SelectedTab = tabControlPrincipal.TabPages[key];
                tabControlPrincipal.TabPages[key].Tag = ventana;
                ventana.Tag = tabControlPrincipal.TabPages[key];

                ventana.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.cerrarPestaña);

                ventana.Show();
            }
        }


        private void compararPreciosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmCotizacion cotizacion = new frmCotizacion();

            generarPestaña(cotizacion);
        }
        
        private void registrarCompraToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Forms.FrmRegistrarCompra RegCompra = new FrmRegistrarCompra();
            RegCompra.ShowDialog();
        }

        private void agregarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Forms.FrmAgregarProv proveedornuevo = new FrmAgregarProv();
            proveedornuevo.Show();
        }
        
        private void gestionarRubrosYCategoriasToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Forms.frmRubrosyCategorias rubrosycat = new Forms.frmRubrosyCategorias();
            rubrosycat.ShowDialog();
        }

        private void gestionarProveedoresToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Forms.frmGestionProveedores gestionProveedores = new Forms.frmGestionProveedores();
            gestionProveedores.ShowDialog();
        }
        
        private void agregarToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Forms.frmAgregarCliente agregarCliente = new frmAgregarCliente();
            agregarCliente.Show();
        }

        private void buscarToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            frmGestionarClientes gestionClientes = new frmGestionarClientes(categUsuario);

            generarPestaña(gestionClientes);
        }

        private void gestionarArticulosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmGestionArticulos gestionArticulos = new frmGestionArticulos(categUsuario);

            generarPestaña(gestionArticulos);
        }

        private void generarPedidoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmAgregarEditarPedido pedido = new frmAgregarEditarPedido();
            pedido.ShowDialog();
        }

        private void pedidosPendientesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmGestionPedidos pedidosPendientes = new frmGestionPedidos();

            generarPestaña(pedidosPendientes);
        }

        private void gestionDeProveedoresToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Forms.frmGestionProveedores gestionProveedores = new Forms.frmGestionProveedores();

            generarPestaña(gestionProveedores);
        }

        private void editarCondicionIVAToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Forms.CondicionesIVA.frmCondicionIVA cond = new Forms.CondicionesIVA.frmCondicionIVA();
            cond.ShowDialog();
        }

        private void GestiondeClientesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Forms.frmGestionarClientes gestionClientes = new frmGestionarClientes(categUsuario);

            

            generarPestaña(gestionClientes);
        }

        private void consultarStockToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FrmConsultarStock form_consulta_stock = new FrmConsultarStock();

            generarPestaña(form_consulta_stock);
        }

        private void CategoriasToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Forms.Configuraciones.FrmGestionCategorias GestionCateg = new Forms.Configuraciones.FrmGestionCategorias();
            GestionCateg.ShowDialog();
        }

        private void articulosMasVendidosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Forms.Informes.FrmArtMasVendidos InformeArtVendidos = new Forms.Informes.FrmArtMasVendidos();
            InformeArtVendidos.ShowDialog();
        }

        private void editarRubrosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmRubrosyCategorias rubros = new frmRubrosyCategorias();
            rubros.ShowDialog();
        }

        private void comprasDeClientesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Forms.Informes.FrmComprasdeCliente CompdeClientes = new Forms.Informes.FrmComprasdeCliente();
            CompdeClientes.ShowDialog();
        }

        private void generarRemitoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Forms.FrmGenerarRemito GenerarRemito = new FrmGenerarRemito();
            GenerarRemito.ShowDialog();
        }

        private void btnCerrarPestaña_Click(object sender, EventArgs e)
        {
            if (tabControlPrincipal.SelectedTab.Name != "tabInicio")
            {
                tabControlPrincipal.TabPages.RemoveAt(tabControlPrincipal.SelectedIndex);
            }
        }
     
        private void cerrarSesiónToolStripMenuItem_Click(object sender, EventArgs e)
        {
            logout = true;
            this.Close();
        }

        private void salirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void lnkGestionPedidosPendientes_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            frmGestionPedidos pedidosPendientes = new frmGestionPedidos();
            generarPestaña(pedidosPendientes);
        }

        private void arreglaarArtToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Random numero = new Random();

            foreach (var art in context.Articulos)
            {
                string nombre = art.art_nombre;
                art.art_nombre = nombre.Replace("\"", "");

                if (art.art_codigobarra == null)
                    art.art_codigobarra = "1223413";

                if (art.art_codigo == "")
                    art.art_codigo = "000000";

                if (art.art_precio_lista == 0)
                {
                    decimal precio = numero.Next(1, 120);
                    precio += Convert.ToDecimal(numero.NextDouble());
                    art.art_precio_lista = precio;
                }

                if (art.art_bonificacion == 0.00m)
                {
                    decimal bonif100 = numero.Next(0, 5000);
                    decimal bonif = bonif100 / 10000;
                    art.art_bonificacion = bonif;
                }

                if (art.art_stock == 1)
                {
                    art.art_stock = numero.Next(50, 1000);
                    art.art_stock_minimo = numero.Next(10, art.art_stock);
                }

            }
            context.SaveChanges();
            MessageBox.Show("Todo ok");
        }

        private void generarIVAVentasToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FrmGenerarIVAVentas LibroIvavtas = new FrmGenerarIVAVentas();
            generarPestaña(LibroIvavtas);
            
        }

        private void linkNuevoPedido_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            frmAgregarEditarPedido ped = new frmAgregarEditarPedido();
            ped.ShowDialog();

            
        }

        private void linkConsultarStock_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            FrmConsultarStock form_consulta_stock = new FrmConsultarStock();

            generarPestaña(form_consulta_stock);


        }

        private void dBToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmConeccionDB db = new frmConeccionDB();
            db.ShowDialog();
        }

        private void largoMaxToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Articulos query = context.Articulos.OrderByDescending(a => a.art_nombre.Length).First();

            MessageBox.Show(query.art_nombre + ": " + query.art_nombre.Length);
        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            FrmGenerarRemito nuevoremito = new FrmGenerarRemito();
            nuevoremito.ShowDialog();
           
        }

        private void seguimientoDeUnArticuloToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FrmSegdeUnArt SeguirunArt = new FrmSegdeUnArt();
            SeguirunArt.ShowDialog();
        }

        private void gestionDeComprobantesToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            FrmGestionComprobantes GestionCompr = new FrmGestionComprobantes();

            generarPestaña(GestionCompr);
        }

        private void autorizacionesDeComprobantesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Forms.GestionAutorizaciones.frmGestionAutorizaciones gestion_auth = new Forms.GestionAutorizaciones.frmGestionAutorizaciones();
            gestion_auth.ShowDialog();
        }

        private void usuariosDelSistemaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Forms.GestionUsuarios.frmGestionUsuarios gestionUsuarios = new Forms.GestionUsuarios.frmGestionUsuarios();
            gestionUsuarios.ShowDialog();
        }

        private void largoMaxToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            MessageBox.Show(context.Articulos.Max(art => art.art_nombre.Length).ToString());
        }

        private void linkLabel1_LinkClicked_1(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Forms.GestionArticulos.ActualizarPrecios actualizarPreciosOf = new Forms.GestionArticulos.ActualizarPrecios();
            actualizarPreciosOf.ShowDialog();

        }

        private void linkLabel1_LinkClicked_2(object sender, LinkLabelLinkClickedEventArgs e)
        {
            frmGestionArticulos gestionArticulos = new frmGestionArticulos(categUsuario);

            generarPestaña(gestionArticulos);
        }

        private void calcularLargoMaximoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show(context.Articulos.Max(art => art.art_nombre.Length).ToString());
        }

        private void dBToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            frmConeccionDB conex = new frmConeccionDB();
            conex.ShowDialog();
        }

        private void hacerBackupToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ////completarrr
        }

        public static void CreateDatabase()
        {
            using (SqlConnection cn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Integrated Security=True;User Instance=True;Connection Timeout=60"))
            {
                cn.Open();
                SqlCommand cmd = new SqlCommand("CREATE DATABASE forumTest1", cn);
                cmd.ExecuteNonQuery();

                SqlConnection cn2 = new SqlConnection(@"Data Source=.\SQLEXPRESS;Integrated Security=True;AttachDbFilename=|DataDirectory|\forumTest1.mdf;User Instance=True;Connection Timeout=60");
                cn2.Open();

            }        
        }

        private void linkGestCompr_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            FrmGestionComprobantes GestComprob = new FrmGestionComprobantes();
            generarPestaña(GestComprob);
        }

        private void exporTarListaDePreciosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Forms.Informes.FrmExportListPrecios ExportListaPre = new FrmExportListPrecios();
            generarPestaña(ExportListaPre);
        }

        private void Principal_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F8)
            {
                e.Handled = true;
                FrmConsultarStock form_consulta_stock = new FrmConsultarStock();
                generarPestaña(form_consulta_stock);
            }

            if (e.KeyCode == Keys.F10)
            {
                e.Handled = true;
                frmAgregarEditarPedido ped = new frmAgregarEditarPedido();
                ped.ShowDialog();
             }
        }

        private void linkLblResumendeCuenta_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Forms.GestionClientes.FrmResumendeDeudas ResumenDeudas = new Forms.GestionClientes.FrmResumendeDeudas(categUsuario);
             generarPestaña(ResumenDeudas);
            
        }

        private void registrarComprasIVAToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Forms.GestionCompras.FrmCompraIVA CompraIVA = new Forms.GestionCompras.FrmCompraIVA();
            generarPestaña(CompraIVA);
        }

        private void btnnFacturarCae_Click(object sender, EventArgs e)
        {

           

        }
    
        }
    }








        
